package core

import (
	"bytes"
	"errors"
	"fmt"
	"github.com/fsnotify/fsnotify"
	"github.com/spf13/viper"
)

// Viper //
// 优先级: 命令行 > 环境变量 > 默认值
// Author [SliverHorn](https://github.com/SliverHorn)
func Viper[T any](config *T, configData []byte) *viper.Viper {
	if len(configData) == 0 {
		panic(errors.New(fmt.Sprintf("config file empty")))
	}

	v := viper.New()
	v.SetConfigType("yaml")
	err := v.ReadConfig(bytes.NewReader(configData))

	if err != nil {
		panic(fmt.Errorf("Fatal error config file: %s \n", err))
	}

	// 监视配置文件变化
	v.WatchConfig()
	v.OnConfigChange(func(e fsnotify.Event) {
		fmt.Println("config file changed:", e.Name)
		if err = v.Unmarshal(config); err != nil {
			fmt.Println(err)
		}
	})

	if err = v.Unmarshal(config); err != nil {
		panic(err)
	}
	return v
}
